package com.cnlive.logpare.comm

import com.cnlive.logpare.util.IPSeekerExt
import scala.collection.mutable.HashSet
import scala.collection.mutable.HashMap
import org.apache.spark.sql.Row
import com.cnlive.logpare.util.ParseLogUtil
/**
 * Row类型分类 1.正常数据 2.直接被过滤条件过滤的数据 3.用 ""分割后，长度不对的数据 4.appid不能分割的数据 5.url中用空格分割长度即不是3个也不是4个的一般都是4个少数为3个  6.url不带参数的
 */
trait CommNginxRun {
    val nginxSplit=""" \"(.*?)\"""".r//普通nginx日志切分
   /**
    * 解析一行nginx日志
    */
   def parLineNginxLogText(iPSeekerExt:IPSeekerExt,lineText:String,sessionSet:HashSet[String],
       parUrlAndTypeToMap:(List[String],HashMap[String, String],HashSet[String])=>Unit,
       mkRowFun: (HashMap[String, String]) => Row,filert:(String)=>Boolean,inStallTime:String):Row={
     if(filert(lineText)){
        val mapRequest=new HashMap[String, String]()//用来存储
        val ipandtime = nginxSplit.split(lineText).toList
        val urlandtype=nginxSplit.findAllIn(lineText).toList
        if(ipandtime.length==2&&urlandtype.length==3){
            val ipandtimeArr=ipandtime(0).split(" ")//由于IP可能有多个所以
            val timeIndx=ipandtimeArr.length-2
            val ip=if (ipandtimeArr(0).indexOf(",") != -1) ipandtimeArr(0).substring(0, ipandtimeArr(0).indexOf(",")) else ipandtimeArr(0)
            val time=ipandtimeArr(timeIndx).replace("[", "")
            mapRequest.put("nginxtime", time);
            ParseLogUtil.parseIptoLocation(iPSeekerExt, ip, mapRequest)//解析IP地址
            parUrlAndTypeToMap(urlandtype,mapRequest,sessionSet)
            mapRequest.put("installtime", inStallTime)
            mkRowFun(mapRequest)
        }else{//日志分割后长度不对！
            return Row(3)
        }
     }else{
       Row(2)
     }
   }
}